import sys
import os
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from sanic import Sanic
from sanic.response import json
from pipeline import PipeLine
from output_format import NerOutputFormat

app = Sanic("crm_web_service")
pipeline = PipeLine(model_name='company_name_entity')
ner_outformat = NerOutputFormat()



@app.route('/ner',methods=['GET',"POST"])
async def predict(request):

    """
    服务函数主入口
    :param input_data: 请求输入数据，形如：
                             {
                                "sentences": [
                                              "收件地址：徐州市新城区新安路5号徐州市公共资源交易中心，收件联系人：周悦悦，收件联系方式：18811939611。",
                                              "投标人采用委托人员送达方式递交U盘的，必须派法定代表人或其授权代理人携加盖公章的单位介绍信（或授权书）、本人身份证明，将U盘送达以下地点，送达地点：徐州市公共资源交易中心一楼北门口（徐州市新城区新安路5号，市规划馆南侧），招标代理机构联系人：周悦悦，电话：18811939611，送达指定地点前应主动与联系人周悦悦联系。"
                                             ]
                             }
    :return:
        返回实体识别结果，形如：
            {
              "ner_result":
                  [
                    {
                      "sentence": "收件地址：徐州市新城区新安路5号徐州市公共资源交易中心，收件联系人：周悦悦，收件联系方式：18811939611。",
                      "LOC": [[5, 27, "徐州市新城区新安路5号徐州市公共资源交易中心"]],
                      "PER": [[34, 37, "周悦悦"]]},
                    {
                      "sentence": "投标人采用委托人员送达方式递交U盘的，必须派法定代表人或其授权代理人携加盖公章的单位介绍信（或授权书）、本人身份证明，将U盘送达以下地点，送达地点：徐州市公共资源交易中心一楼北门口（徐州市新城区新安路5号，市规划馆南侧），招标代理机构联系人：周悦悦，电话：18811939611，送达指定地点前应主动与联系人周悦悦联系。",
                      "LOC": [[74, 90, "徐州市公共资源交易中心一楼北门口"], [91, 102, "徐州市新城区新安路5号"], [103, 109, "市规划馆南侧"]],
                      "ORG": [[111, 117, "招标代理机构"]],
                      "PER": [[121, 124, "周悦悦"], [154, 157, "周悦悦"]]
                    }
                  ],
              "is_success": true
            }
    注意：
        1、输入的sentences中，每个字符串中不要包含空格或tab，前后的空格/换行符等会被忽略掉
        2、如果文本中，不包含某实体，则返回的结果中，不会有该实体的key，如上面示例的第一条返回，没有ORG这个实体key
    """

    if request.method == 'GET':
        sentences = [request.args.get('sentence',"")]
    elif request.method == "POST":
        sentences = request.json['sentences']
    else:
        sentences = [""]
    is_success, model_res = pipeline.predict(sentences)
    if is_success:
        res = ner_outformat.parse_output(model_res)
        res['is_success'] = True
    else:
        res = {
            'is_success': False,
            'ner_result': []
        }

    return json(res,ensure_ascii=False)

if __name__ == "__main__":
  app.run(host='0.0.0.0', port=8000, access_log=False,debug=True)
